Graph Algorithms / Labyrinth

#include <bits/stdc++.h>
using namespace std;

using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using usize = size_t;
using uptr = uintptr_t;

using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;
using isize = make_signed_t<size_t>;
using iptr = intptr_t;

using f32 = float_t;
using f64 = double_t;

constexpr i32 Modulus = 1e9 + 7;

const vector<pair<u16, u16>> Directions{{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
const vector<char> DirectionLetters = {'L', 'R', 'U', 'D'};
const u8 DirectionCount = Directions.size();

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    u16 height, width;
    cin >> height >> width;

    auto labyrinthMap = vector<string>(height);
    u16 startY, startX;
    u16 endY, endX;
    for (u16 y = 0; y < height; y += 1)
    {
        string& row = labyrinthMap[y];
        cin >> row;

        for (u16 x = 0; x < width; x += 1)
        {
            if (row[x] == 'A')
            {
                startY = y;
                startX = x;
            }
            else if (row[x] == 'B')
            {
                endY = y;
                endX = x;
            }
        }
    }

    auto moveDirections = vector<vector<u8>>(height, vector<u8>(width, DirectionCount));
    queue<pair<u16, u16>> qu;

    moveDirections[startY][startX] = 0;
    qu.emplace(startY, startX);

    while (!qu.empty())
    {
        auto [y, x] = qu.front();
        qu.pop();

        if (y == endY && x == endX)
        {
            string path;
            while (y != startY || x != startX)
            {
                u8 directionIndex = moveDirections[y][x];
                path += DirectionLetters[directionIndex];
                auto [dy, dx] = Directions[directionIndex ^ 1];
                y += dy;
                x += dx;
            }

            reverse(path.begin(), path.end());
            cout << "YES" << '\n';
            cout << path.length() << '\n';
            cout << path;
            return 0;
        }

        for (u8 directionIndex = 0; directionIndex < DirectionCount; directionIndex += 1)
        {
            auto [dy, dx] = Directions[directionIndex];
            u16 ny = y + dy;
            u16 nx = x + dx;
            if (ny < height && nx < width && labyrinthMap[ny][nx] != '#' && moveDirections[ny][nx] == DirectionCount)
            {
                moveDirections[ny][nx] = directionIndex;
                qu.emplace(ny, nx);
            }
        }
    }

    cout << "NO" << '\n';

    return 0;
}